package com.qf.day02;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 *  锁的特性
 *   1、可重入
 *   2、公平锁 非公平锁  锁被释放的时候：其它线程是抢     公平锁：等待时间最长优先获取到锁  还是排队 FIFO 先进先出原则
 *   3、限时等待   ： 过期不候    lock.tryLock(1, TimeUnit.SECONDS);  不见不散  lock.lock
 *   4、读写锁
 *      Mysql行锁 表锁   读读可并发  写写不可并发
 *         锁： 读不上锁  写的上锁
 *
 *      锁：
 *        独占锁 : 读上锁 写上锁
 *        排它锁  : 读上锁 写上锁
 *        悲观锁 ：读上锁 写上锁
 *        -----------------------
 *        乐观锁 ： 读无锁 写上锁
 *        读写锁 ：
 *          读锁：  读无锁 写上锁
 *          写锁：  读上锁 写上锁
 *
 *         读读可并发  写写不可并发
 *        ....
 *
 *      Map 本地锁
 *      map.get() 读 没有锁
 *      map.put() 写 有锁
 *      List
 *      Set
 *      Map
 *      集合：是线程不安全
 *
 *      JUC
 *      ConcurrentHashMap:是线程安全的
 *        写：上锁 是安全
 *        读：无锁 不安全的
 *
 *
 *
 *
 * @author lixu
 */
public class ReentrantLockDemo {

    //JUC
     public static final Lock lock = new ReentrantLock(true);//公平锁


    public static void main(String[] args) {
        ReentrantLockDemo reentrantLockDemo = new ReentrantLockDemo();
        new Thread(() -> {
            reentrantLockDemo.a();//一个线程  多次获取同一把锁
        }).start();
  /*      new Thread(() -> {
            reentrantLockDemo.b();
        }).start();*/
        //现在这把锁是谁？

    }

    public void a(){
        lock.lock();//不见不散

        System.out.println("我是a");
        b();
        lock.unlock();
    }
    public void b(){
        lock.lock();
        System.out.println("我是b");
        c();
        lock.unlock();
    }
    public void c(){
        lock.lock();
        System.out.println("我是c");
        lock.unlock();
    }
}
